/*
 * Vector.cpp
 *
 *  Created on: Oct 31, 2012
 *      Author: Carlos Alegría
 */

#include "Vector.h"

namespace poo
{

  // Implementación del constructor de la clase.
  //
  // La notación "attr(valor)" después de los dos puntos indica que el atributo
  // "attr" debe ser inicializado con el valor "valor". Esta inicialización se
  // realiza cuando la memoria es reservada para los atributos de la clase.
  //
  Vector3D::Vector3D(int x, int y, int z) :
      x(x), y(y), z(z)
  {
  }

  // Implementación del destructor de la clase
  //
  Vector3D::~Vector3D()
  {
  }

  //
  // Implementación de la operación de suma
  //
  // Ya que este operador fue declarado como miembro de la clase, es necesario
  // utilizar el operador de resolución de alcance.
  //
  Vector3D &
  Vector3D::operator+(const Vector3D &v)
  {
    return *(new Vector3D(this->x + v.x, this->y + v.y, this->z + v.z));
  }

  //
  // Los siguientes operadores no fueron declarados como miembros de la clase,
  // por lo que no es necesario utilizar el operador de resolución de alcance.
  //

  // Implementación de la operación de resta
  //
  Vector3D &
  operator-(const Vector3D &v, const Vector3D &w)
  {
    return *(new Vector3D(v.x - w.x, v.y - w.y, v.z - w.z));
  }

  // Implementación de la operación de inserción a un stream
  //
  ostream &
  operator<<(ostream &output, const Vector3D &v)
  {
    output << "( " << v.x << ", " << v.y << ", " << v.z << " )";
    return output;
  }

  // Implementación de la operación de multiplicación por un escalar
  //
  Vector3D &
  operator*(int c, const Vector3D &v)
  {
    return *(new Vector3D(v.getX() * c, v.getY() * c, v.getZ() * c));
  }

} /* namespace poo */
